home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1994 / MacHack 1994.toast / MacHack™ 1987-1994 / MacHack™ '93 / Papers '93 / Macintosh as Internet Server ƒ / inetd / Libraries / DaemonApp / CQueue.cp < prev    next >
Encoding:
Text File  |  1993-04-07  |  3.3 KB  |  215 lines  |  [TEXT/MPS ]

  1. //---------------------------------------------------------------------
  2. //
  3. //    Copyright © 1992 David Peterson.
  4. //    All rights reserved.
  5. //
  6. //    Permission to use, copy, modify, and distribute this software for
  7. //    any purpose and without fee is hereby granted, provided that the
  8. //    above copyright notice appear in all copies and that both that
  9. //    copyright notice and this permission notice appear in supporting
  10. //    documentation.
  11. //
  12. //---------------------------------------------------------------------
  13.  
  14. #include "CQueue.h"
  15.  
  16. #ifndef __MEMORY__
  17. #include <Memory.h>
  18. #endif
  19.  
  20.  
  21. CQueue::CQueue()
  22. {
  23.     fFreeQueue.qFlags = nil;
  24.     fFreeQueue.qHead = nil;
  25.     fFreeQueue.qTail = nil;
  26.  
  27.     fInUseQueue.qFlags = nil;
  28.     fInUseQueue.qHead = nil;
  29.     fInUseQueue.qTail = nil;
  30.     
  31.     fCompletedQueue.qFlags = nil;
  32.     fCompletedQueue.qHead = nil;
  33.     fCompletedQueue.qTail = nil;
  34.     
  35.     fProcessingQueue.qFlags = nil;
  36.     fProcessingQueue.qHead = nil;
  37.     fProcessingQueue.qTail = nil;
  38.     
  39.     fNumPBs = 0;
  40.  
  41.     fFree = 0;
  42.     fInUse = 0;
  43.     fCompleted = 0;
  44.     fProcessing = 0;
  45.  
  46. }
  47.  
  48. /*    Move everything over to the free queue so that we rip through
  49.     it freeing all the memory blocks we allocated
  50. */
  51. CQueue::~CQueue()
  52. {
  53.     ParmBlkPtr    pb        = nil;
  54.     
  55.     while ((pb = this->CleanQs()) != nil)
  56.         this->RecyclePB(pb);
  57.     
  58.     while ((pb = this->CleanFreeQ()) != nil) 
  59.         DisposePtr((Ptr) pb);
  60. }
  61.  
  62. Boolean
  63. CQueue::AllocPBs(int howmany, int size)
  64. {
  65.     Ptr p;
  66.     int    i;
  67.  
  68.     for (i = 0; i < howmany; i++) {
  69.         p = NewPtrClear(size);
  70.         if (p) {
  71.             Enqueue((QElemPtr) p, &fFreeQueue);
  72.             fFree++;
  73.             fNumPBs++;
  74.         }
  75.         else
  76.             return false;
  77.     }
  78.     
  79.     return true;
  80. }
  81.  
  82. ParmBlkPtr
  83. CQueue::GetUnusedPB()
  84. {
  85.     QElemPtr    pb = nil;
  86.     
  87.     pb = fFreeQueue.qHead;
  88.     if (pb) {
  89.         Dequeue(pb, &fFreeQueue);
  90.         fFree--;
  91.         
  92.         Enqueue(pb, &fInUseQueue);
  93.         fInUse++;
  94.     }
  95.     
  96.     return (ParmBlkPtr) pb;
  97. }
  98.  
  99. void
  100. CQueue::StoreCompletedPB(ParmBlkPtr pb)
  101. {
  102.     Dequeue((QElemPtr) pb, &fInUseQueue);
  103.     fInUse--;
  104.  
  105.     Enqueue((QElemPtr) pb, &fCompletedQueue);
  106.     fCompleted++;
  107. }
  108.  
  109. ParmBlkPtr
  110. CQueue::GetCompletedPB()
  111. {
  112.     QElemPtr    pb = nil;
  113.     
  114.     pb = fCompletedQueue.qHead;
  115.     if (pb) {
  116.         Dequeue(pb, &fCompletedQueue);
  117.         fCompleted--;
  118.         
  119.         Enqueue(pb, &fProcessingQueue);
  120.         fProcessing++;
  121.     }
  122.     
  123.     return (ParmBlkPtr) pb;
  124. }
  125.  
  126. void
  127. CQueue::RecyclePB(ParmBlkPtr pb)
  128. {
  129.     Dequeue((QElemPtr) pb, &fProcessingQueue);
  130.     fProcessing--;
  131.  
  132.     Enqueue((QElemPtr) pb, &fFreeQueue);
  133.     fFree++;
  134. }
  135.  
  136. ParmBlkPtr
  137. CQueue::CleanQs()
  138. {
  139.     ParmBlkPtr    pb = nil;
  140.     
  141.     if ((pb = this->CleanInUseQ()) != nil)
  142.         return pb;
  143.     else if ((pb = this->CleanCompletedQ()) != nil)
  144.         return pb;
  145.     else if ((pb = this->CleanProcessingQ()) != nil)
  146.         return pb;
  147.     else
  148.         return nil;
  149. }
  150.  
  151. ParmBlkPtr
  152. CQueue::CleanFreeQ()
  153. {
  154.     QElemPtr    pb = nil;
  155.     
  156.     pb = fFreeQueue.qHead;
  157.     if (pb) {
  158.         Dequeue(pb, &fFreeQueue);
  159.         fFree--;
  160.     }
  161.     
  162.     return (ParmBlkPtr) pb;
  163. }
  164.  
  165. ParmBlkPtr
  166. CQueue::CleanInUseQ()
  167. {
  168.     QElemPtr    pb = nil;
  169.     
  170.     pb = fInUseQueue.qHead;
  171.     if (pb) {
  172.         Dequeue(pb, &fInUseQueue);
  173.         fInUse--;
  174.         
  175.         Enqueue(pb, &fFreeQueue);
  176.         fFree++;
  177.     }
  178.     
  179.     return (ParmBlkPtr) pb;
  180. }
  181.  
  182. ParmBlkPtr
  183. CQueue::CleanCompletedQ()
  184. {
  185.     QElemPtr    pb = nil;
  186.     
  187.     pb = fCompletedQueue.qHead;
  188.     if (pb) {
  189.         Dequeue(pb, &fCompletedQueue);
  190.         fCompleted--;
  191.         
  192.         Enqueue(pb, &fFreeQueue);
  193.         fFree++;
  194.     }
  195.     
  196.     return (ParmBlkPtr) pb;
  197. }
  198.  
  199. ParmBlkPtr
  200. CQueue::CleanProcessingQ()
  201. {
  202.     QElemPtr    pb = nil;
  203.     
  204.     pb = fProcessingQueue.qHead;
  205.     if (pb) {
  206.         Dequeue(pb, &fProcessingQueue);
  207.         fProcessing--;
  208.         
  209.         Enqueue(pb, &fFreeQueue);
  210.         fFree++;
  211.     }
  212.     
  213.     return (ParmBlkPtr) pb;
  214. }
  215.